﻿using NetCore8Demo.Models.Communication.SerialPortFolder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NetCore8Demo.Models.Axis;
using NetCore8Demo.Models.PLC;
using NetCore8Demo.ViewModels.Communication.SerialPortFolder;
using NetCore8Demo.ViewModels.PLC;

namespace NetCore8Demo.Tool
{
    public static class StaticTool
    {
        /// <summary>
        /// 加载所有的Json参数,串口集合、PLC信息及地址信息集合、轴信息集合
        /// </summary>
        public static void LoadAllJsonParam()
        {
            StaticSerialPort.InitStaticSerialPortInfoList();//加载 SerialPortInfoList 集合
            StaticPlc.InitStaticPlcAddressInfoList();//加载 PlcInfoList、PlcAddressInfoList 集合
            StaticAxis.InitStaticAxisInfoList(); //加载 AxisInfoList 集合
        }

        #region 串口相关
        public static List<SerialPortTool> SerialPortToolList = new List<SerialPortTool>();


        /// <summary>
        /// 打开所有已经启用且存在的串口
        /// </summary>
        /// 
        //1.如果修改完串口参数，在调用该方法前，先更新了SerialPortInfoList,那就会先关闭原先打开的串口，再打开新的，实现了参数热切换。
        // 2.每个SerialPortTool 跟 SerialPortInfo 是一对一的关系,SerialPortTool构造方法要传SerialPortInfo
        // 3.SerialPortTool 里面含有一个 SerialPort 对象，SerialPortTool 根据SerialPortInfo的信息，将SerialPort 初始化
        // 4.后续的操作实际就是操作的SerialPort对象，写成静态的，保证了可以跨页面操作。
        // 5.重新初始化，是对静态对象的操作。关闭了已经打开的串口，再重新打开新的。
        // 6.如果配置了串口，且启用了，程序打开后会占用串口
        public static void InitSerialPortToolList()
        {
            CloseAllSerialPort();
            SerialPortToolList.Clear();
            foreach (var item in StaticSerialPort.SerialPortInfoList)
            {
                SerialPortToolList.Add(new SerialPortTool(item));
            }
            OpenAllSerialPort();
        }

        public static void OpenAllSerialPort()
        {
            foreach (var item in SerialPortToolList)
            {
                item.OpenSerialPort();
            }
        }

        public static void CloseAllSerialPort()
        {
            foreach (var item in SerialPortToolList)
            {
                item.CloseSerialPort();
            }
        }




        #endregion


        #region PLC相关
        public static List<PlcTool> PlcToolList = new List<PlcTool>();

        /// <summary>
        /// 根据PlcInfo信息，初始化对应的工具集合，不打开关闭Plc
        /// </summary>
        public static void InitPlcToolList()
        {
            PlcToolList.Clear();
            foreach (var item in StaticPlc.PlcInfoList)
            {
                PlcToolList.Add(new PlcTool(item));
            }
        }

        public static void OpenAllPlc()
        {
            foreach (var item in PlcToolList)
            {
                item.ConnPlc();
            }
        }

        public static void CloseAllPlc()
        {
            foreach (var item in PlcToolList)
            {
                item.ClosePlc();
            }
        }


        public static void ReadAllPlc()
        {
            foreach (var item in PlcToolList)
            {
                item.ReadAll();
            }
        }

        #endregion



    }
}
